【新機能】Amazon EC2 Container Service(ECS)でNetworking ModeとMemory Reservationがサポートされました
はじめに
今回ご紹介する新機能はこちら。8/15にリリースされたものです。
Amazon EC2 Container Service(ECS)に2つのアップデートがありました。
- Networking modeが変えられるようになった。これまでは仮想ブリッジを経由してコンテナが直接外部に接続されるBridgeモードのみだったが、新たに、仮想ブリッジを使わずにホストOSのネットワークスタックをそのまま使うHostモードとネットワークスタックを作成しないNoneモードが選べるようになった。
- Memory Reservatin(メモリ予約)。メモリに対するソフトリミットが出来るようになった。
ということで実際にやってみました。
やってみた
以下のようにECSクラスタを構成しています。ECSクラスタには2つのECSインスタンスが所属しています。
Task Definitionの作成
[Task Definitions]から[Create new Task Definition]ボタンをクリックします。
[Create new Task Definition]で[Network Mode]という選択肢が増えています。これが今回の新機能の1つです。
[Host]を選んだ場合は、以下のようにホストのネットワークスタックを共有する旨の警告が表示されます。
[None]を選んだ場合は、以下のようにネットワークスタックが作成されない旨の警告が表示されます。
今回は[Host]として設定します。設定後、[Container Definitions]欄の[Add container]ボタンをクリックします。
[Add container]画面の[Memory Limits]で[Soft Limit]が選べるようになっています。これが今回の新機能の2つめ、Memory Reservation対応です。Soft Limitを設定し[Add]ボタンをクリックします。
Container一覧に、Soft memory limitsが設定された状態でコンテナが登録されていることを確認します。[Create]ボタンをクリックします。
Task Definitionの作成が成功したメッセージが表示されます。
Taskの実行
次に[Cluster]画面から[Tasks]-[Run new Task]ボタンをクリックします。
[Run Task]画面で、先ほど作ったTask Definitionを選択し、[Run Task]ボタンをクリックします。
Taskが実行されました。
動作確認
タスクが実行されているコンテナインスタンスを開いて、Public IPを確認します。
確認したPublic IPにcurlコマンドでアクセスすると、nginxのアウトプットを取得できます。
$ curl http://52.xx.xx.xx/ <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
コンテナインスタンスのSecurity Groupの設定を変更した上で、SSHでログインします。docker networkで、これまでデフォルト設定であったbridgeの状況を確認すると、コンテナがbridgeネットワークを使っていないことがわかります。
$ docker network inspect bridge [ { "Name": "bridge", "Id": "xxxxxxxxxx", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16" } ] }, "Internal": false, "Containers": {}, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ]
次にdocker networkで、hostの状況を確認すると、ecs-agentコンテナと今回作成したコンテナがhostネットワークを使っていないことがわかります。Network modeが変わっていることがわかりました!
$ docker network inspect host [ { "Name": "host", "Id": "xxxxxxxxxx", "Scope": "local", "Driver": "host", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [] }, "Internal": false, "Containers": { "xxxxxxxxxx": { "Name": "ecs-agent", "EndpointID": "xxxxxxxxxx", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" }, "xxxxxxxxxx": { "Name": "ecs-web-2-web-xxxxxxxxxx", "EndpointID": "xxxxxxxxxx", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
AWS管理コンソールから該当のタスクを開くと、Soft memory limitが設定されていることがわかります!
さいごに
ECSがDockerの機能にどんどん追従していってることがわかります。今回追加されたNetwork ModeとMemory Reservationはまだecs-cli composeからは設定できないようですが、これも近いうちに設定されるようになるでしょう。ますます便利になりますね!